/**
 * 360点金广告接入
 *
 * author: chenjun@bytedance.com
 *
 *
 */
import throttle from 'lodash/throttle';

var _uid = 0,
    _consumeIndex = -1, // 广告消费索引
    _adsSource = [],    // 原始广告数据
    _adsMonitor = [],   // 页面监听中的广告
    _adReportName = '', // 广告上报名称
    _showid = 'P5AcFE',  // 标示广告位置  默认是主 feed 流广告
    _adHttpUrl = 'http://show.g.mediav.com/s',
    _adHttpsUrl = 'https://show-g.mediav.com/s',
    _adUrl = window.location.protocol.indexOf('https') === 0 ? _adHttpsUrl : _adHttpUrl,
    winClientSize = _getWinSize();

// 获取hash
function _getHash(str) {
  var hash = 1,
      charCode = 0,
      idx;

  if(str) {
    hash = 0;
    for(idx = str.length - 1; idx >= 0; idx--) {
       charCode = str.charCodeAt(idx);
       hash = (hash << 6&268435455) + charCode+ (charCode << 14);
       charCode = hash&266338304;
       hash = charCode != 0 ? hash ^ charCode>>21 : hash;
    }
  }
  return hash;
}

// 获取uid，主要是为了去重
function _getUid() {
  var uid = _uid;

  if (uid) return uid;

  var d = (new Date() - 0);
  var s = window.location.href;
  var hash = _getHash(s);

  uid = '' + d + hash + Math.random() + Math.random() + Math.random() + Math.random();
  uid = uid.replace(/\./g, '').substring(0, 32);
  _uid = uid;

  return uid;
}

/**
 * 添加监听事件
 */
function _addEvent(elem, type, handler) {
  if (elem.addEventListener) {
    elem.addEventListener(type, handler, false);
    return handler;
  } else if (elem.attachEvent) {
    var wrapper = function () {
      var event = window.event;
      event.target = event.srcElement;
      handler.call(elem, event);
    };
    elem.attachEvent('on' + type, wrapper);
    return wrapper;
  }
}

/**
 * 获取元素标签属性
 */
function _getAttribute(elem, attr) {
  if (!elem) return '';

  var attribute = elem.getAttribute(attr);

  return attribute? attribute : '';
}

/**
 * 设置元素属性
 */
function _setAttribute(elem, attr, value) {
  if (!elem) return;

  elem.setAttribute(attr, value);
}

/**
 * 元素是否主要内容在可视区
 */
function _isContentInView(elem) {
  var rect = elem.getBoundingClientRect();

  return (
      rect.top + 10 < winClientSize.winHeight &&
      rect.bottom > 10
  );
}

/**
 * 获取窗口尺寸
 */
function _getWinSize() {
  if (window.innerHeight && window.innerWidth) {
     return {
       winWidth: window.innerWidth,
       winHeight: window.innerHeight
     };
  }
  if (document.documentElement && document.documentElement.clientHeight
    && document.documentElement.clientWidth) {
    return {
      winWidth: document.documentElement.clientWidth,
      winHeight: document.documentElement.clientHeight
    }
  }
}

/**
 * 字段转换
 *
 * 点金广告目前都是单图形式
 *
 */
function _paramsMap(index) {
  var adObj = _adsSource[index],
      result;

  result = {
    ad_qihu_id: index,  // 广告数组的索引为广告的Key
    article_genre: 'ad',
    single_mode: true,
    ad_label: '聚效广告',
    source_url: adObj.curl || '',
    image_url: adObj.img || '',
    title: adObj.title || '',
    source: adObj.src || '',
    behot_time: Math.floor(new Date().getTime()/1000)
  };

  // 组图
  if (adObj.assets && adObj.assets.length) {
    result['image_list'] =  [];
    for (var i = 0; i < adObj.assets.length; i++) {
      var asset = adObj.assets[i];
      result['image_list'].push({
        url: asset.img,
        source_url: asset.curl  // 拥有独立访问链接
      });
    }
    result['has_gallery'] = true;
    result['single_mode'] = false;
  }

  return result;
}

// 只支持函数拿到数据的jsonp方式
window._qihu_jsonpFun_ = function(data) {
  if (data && data.ads && data.ads.length) {
    _adsSource = _adsSource.concat(data.ads);
    window.ttAnalysis && window.ttAnalysis.send('event', {ev: 'feed_qihu_adshow_count', ext_id: data.ads.length});
  }
};

/*
 * 广告请求
 * 注：由于 360 返回的 JSONP 结果是非标准格式，导致 http 工具库会报错，故此处用原生写法
 */
function formatParams(data) {
  var arr = [];
  for (var name in data) {
    arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
  }
  return arr.join('&');
}
function jsonp(options) {
  options = options || {};
  if (!options.url) {
    return false;
  }
  var oHead = document.getElementsByTagName('head')[0];
  var params = formatParams(options.data);
  var oS = document.createElement('script');
  oS.setAttribute("async", "");
  oHead.appendChild(oS);
  oS.src = options.url + '?' + params;
}
function _getAds(count) {
  jsonp({
    url: _adUrl,
    data: {
      jsonp: '_qihu_jsonpFun_',
      type: 1,
      of: 4,
      newf: 1,
      showid: _showid,
      ref: 'toutiao.com', //test 正式上线不需要
      uid: _getUid(),
      scheme: window.location.protocol.slice(0, -1),
      impct: count, // 广告需求量
      time: 'ts_' + (+new Date())
    }
  });
}

// 广告展示
function _adShow() {
  for (var tmp, i = 0, len = _adsMonitor.length; i < len; i++) {
    tmp = _adsMonitor[i];

    if (_isContentInView(tmp)) {
      if (_getAttribute(tmp, 'ad_show') != 1) {
        _setAttribute(tmp, 'ad_show', 1);

        // 展现上报
        _adReport(_getAttribute(tmp, 'ad_qihu_id'), _adReportName, 'show');
      }
    } else {
      _setAttribute(tmp, 'ad_show', 0);
    }
  }
}

// 统计上报
function _adReport(adIndex, name, type, extra) {
  var adObj = _adsSource[adIndex],
      reportUrls;

  if (!adObj) return;

  reportUrls = type == 'show'? adObj.imptk : adObj.clktk;

  for (var i = 0, len = reportUrls.length; i < len; i++) {
    window['_ad_qihu_img_'] = new Image();
    window['_ad_qihu_img_'].src = reportUrls[i];
  }

  var eventName = name + '_' + type;
  if (extra) {
    eventName += '_' + extra;
  }
  window.ttAnalysis && window.ttAnalysis.send('event', {ev: eventName});
}

/**
 * 消费广告
 *
 * 数组里面有广告就消费一个，没有就请求
 * page: 广告所在页面
 * return: 广告->feed流展现逻辑的实例
 */
function _consumeAd() {
  // 广告预加载
  if (_adsSource.length - (_consumeIndex+1) < 2) {
    _getAds(5);
  }

  // 有可消费广告
  if (_consumeIndex + 1 < _adsSource.length) {
    return _paramsMap(++_consumeIndex);
  }

  return null;
}

/**
 * 广告注入
 * page: 所在页面
 */
function insertQihuAd(arr) {
  var adObj = _consumeAd(),
      adIndex,
      hasAd = false; // 是否有原生广告

  if (adObj && arr.length) {

    for (var i = 0, len = arr.length; i < len; i++) {
      if (arr[i].ad_id) {
        hasAd = true;
        arr[i] = adObj;
        break;
      }
    }

    // 保证广告在第四位
    if (!hasAd) {
      adIndex = arr.length > 3 ? 3 : arr.length;
      arr.splice(adIndex, 0, adObj);
    }

  }
}

/**
 * 广告监听
 * ads: 监听的 DOM 元素
 * name: 上报事件的名字
 */
function qhSetAds(ads, name) {
  _adsMonitor = ads;
  _adReportName = name;
  _adShow();
}

/**
 * 广告上报
 * name: 上报事件的名称
 * type: 上报事件的类型
 * extra: 上报事件的补充信息
 */
function qhSendMsg(adIndex, name, type, extra) {
  _adReport(adIndex, name, type, extra);
}


_addEvent(window, 'scroll', throttle(function() {
  _adShow();
}, 200));


export  {
  insertQihuAd,
  qhSetAds,
  qhSendMsg
};



// WEBPACK FOOTER //
// ./~/byted-toutiao-pc-business-components/components/feed/src/_data/qhAdMonitor.js
